package ru.agiledev.aos.data;

import org.hibernate.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ru.agiledev.aos.commons.dto.QType;
import ru.agiledev.aos.data.domain.*;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Helper class for dictionaries generation
 * Created by a.kirillov
 */
public class DictionariesGenerator {
    Logger logger = LoggerFactory.getLogger(DictionariesGenerator.class);

    public DictionariesGenerator() {}


    private void generateDictionaries(){
        //Very ugly solution but there is no other way
        List<IndicatorWord> indicatorList = new ArrayList<IndicatorWord>();

        addToList(indicatorList, new String[]{"устраивать", "структурировать", "организовывать"}, QType.STRUCTURE_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"устройство",  "структура", "организация",  "составляющая", "компонент", "элемент"}, QType.STRUCTURE_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь",  "состоять", "из",  "что", "у", "обладать", "есть", " часть"}, QType.STRUCTURE_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);

        addToList(indicatorList, new String[]{"характеристика",  "свойство", "показатель"}, QType.CHARACTERISTICS_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь",  "что", "у", "обладать", "есть"}, QType.CHARACTERISTICS_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);

        addToList(indicatorList, new String[]{"работать", "функционировать", "действовать"}, QType.WORK_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"работа", "функционирование", "действие"}, QType.WORK_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь", "что", "у", "обладать", "есть", "выполнять"}, QType.WORK_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);


        addToList(indicatorList, new String[]{"функция", "обязанность"}, QType.FUNCTIONS_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь",  "что", "у", "обладать", "есть", "выполнять", "наделять"}, QType.FUNCTIONS_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);

        addToList(indicatorList, new String[]{"назначение", "предназначение", "цель", "миссия", "роль"}, QType.MISSION_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"предназначать", "создавать", "сконструировать", "построить", "разрабатывать", "спроектировать"}, QType.MISSION_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь",  "что", "у", "обладать", "есть", "выполнять", "преследовать", "в", "при"}, QType.MISSION_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);

        addToList(indicatorList, new String[]{"применять", "использовать", "задействовать",
                "употреблять", "эксплуатировать", "утилизировать",
                "пользоваться","применяться", "использоваться",
                "употребляться", "эксплуатироваться", "утилизироваться", "пользоваться"}, QType.USAGE_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"применение", "использование", "эксплуатация", "употребление", "утилизация", "пользование", "задействование"}, QType.USAGE_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь",  "что", "у", "обладать", "есть"}, QType.USAGE_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);
        addToList(indicatorList, new String[]{"главный",  "образ", "основной", "принцип", "какой", "каков", "как", "правило"}, QType.USAGE_DESCRIPTION, WordTypes.ADDITIVE_EMPTY_CHAIN_PRODUCER);


        addToList(indicatorList, new String[]{"группа", "класс", "категория", "тип"}, QType.CORRESPONDS_TO_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"в","главный",  "образ", "основной", "принцип", "какой", "каков", "как", "к", "кто", "что", "принципиально", "существенно", "косвенно"}, QType.CORRESPONDS_TO_DESCRIPTION, WordTypes.ADDITIVE_EMPTY_CHAIN_PRODUCER);
        addToList(indicatorList, new String[]{"относиться", "принадлежать", "представлять", "входить"}, QType.CORRESPONDS_TO_DESCRIPTION, WordTypes.ADDITIVE_POINTER);//this for words that identify type in minor case



        addToList(indicatorList, new String[]{"отличаться", "различаться", "расходиться", "несхожий", "непохожий", "расхожий", "несоответствовать"}, QType.DIFFERENCES_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"отличие", "различие", "несхожесть", "непохожесть", "расхождение", "несовпадение", "несоответствие", "разница"}, QType.DIFFERENCES_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"и", "с", "от", "на"}, QType.DIFFERENCES_DESCRIPTION, WordTypes.CONJUNCTION_POINTER);
        addToList(indicatorList, new String[]{"иметь",  "что", "у", "обладать", "есть", "в", "между"}, QType.DIFFERENCES_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);

        addToList(indicatorList, new String[]{"похожий", "подобный", "аналогичный", "схожий", "общий"}, QType.COMMONS_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"аналогичность", "схожесть", "сходство", "похожесть"}, QType.COMMONS_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"и", "с", "от", "на"}, QType.COMMONS_DESCRIPTION, WordTypes.CONJUNCTION_POINTER);
        addToList(indicatorList, new String[]{"иметь",  "что", "у", "обладать", "есть", "в", "между"}, QType.COMMONS_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);

        addToList(indicatorList, new String[]{"особенность", "специфика","уникальность"}, QType.FEATURES_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"уникальный", "особенный", "отличительный", "специфичный"}, QType.FEATURES_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"обстоятельство", "условие", "при", "ситуация"}, QType.FEATURES_DESCRIPTION, WordTypes.SECOND_TYPE_WORD);

        addToList(indicatorList, new String[]{"иметь",  "что", "у", "обладать", "есть", "в", "каков", "какой", "себе"}, QType.FEATURES_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);

        addToList(indicatorList, new String[]{"работать", "вести", "функционировать", "функционирование", "работа", "действовать", "работа", "поведение", "действие"}, QType.FEATURES_DESCRIPTION, WordTypes.ADDITIVE_EMPTY_CHAIN_PRODUCER);
        addToList(indicatorList, new String[]{"условие", "ситуация", "обстоятельство", "при"}, QType.FEATURES_DESCRIPTION, WordTypes.CONJUNCTION_POINTER);


        addToList(indicatorList, new String[]{"возможность","способный","мочь"}, QType.POSSIBILITIES_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь",  "что", "у", "обладать", "есть", "наделять"}, QType.POSSIBILITIES_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);


        addToList(indicatorList, new String[]{"успех","неудача","достижение", "добиваться", "достигать"}, QType.GOALS_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь",  "что", "у","какой", "каков", "за", "в", "к", "быть"}, QType.GOALS_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);
        addToList(indicatorList, new String[]{"один",  "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "десять"}, QType.GOALS_DESCRIPTION, WordTypes.ADDITIVE_POINTER);
        addToList(indicatorList, new String[]{"прошедший", "прошлый", "позапрошлый", "текущий"}, QType.GOALS_DESCRIPTION, WordTypes.ADDITIVE_EMPTY_CHAIN_PRODUCER);

        addToList(indicatorList, new String[]{"изменение", "изменяться"}, QType.SETS_CHANGES_DESCRIPTION, WordTypes.TYPE_WORD);
        addToList(indicatorList, new String[]{"структурный", "структура", "состав"}, QType.SETS_CHANGES_DESCRIPTION, WordTypes.SECOND_TYPE_WORD);
        addToList(indicatorList, new String[]{"иметь",  "что", "как", "у", "за", "к", "быть", "в", "какой", "каков", "касаться", "затрагивать", "происходить"}, QType.SETS_CHANGES_DESCRIPTION, WordTypes.EMPTY_CHAIN_PRODUCER);
        addToList(indicatorList, new String[]{"компания",  "департамент", "отдел", "руководство", "фирма", "предприятие"}, QType.SETS_CHANGES_DESCRIPTION, WordTypes.DOMAIN_WORD);
        addToList(indicatorList, new String[]{"один",  "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "десять"}, QType.SETS_CHANGES_DESCRIPTION, WordTypes.ADDITIVE_POINTER);
        addToList(indicatorList, new String[]{"прошедший", "прошлый", "позапрошлый", "текущий"}, QType.SETS_CHANGES_DESCRIPTION, WordTypes.ADDITIVE_EMPTY_CHAIN_PRODUCER);


        //------------------------- start words list -------------------------------------------------------
        addToList(indicatorList, new String[]{"как", "из"},QType.STRUCTURE_DESCRIPTION, WordTypes.START_WORD);
        addToList(indicatorList, new String[]{"как"},QType.WORK_DESCRIPTION, WordTypes.START_WORD);

        addToList(indicatorList, new String[]{"как", "когда"},QType.USAGE_DESCRIPTION, WordTypes.START_WORD);
        addToList(indicatorList, new String[]{"как"},QType.FEATURES_DESCRIPTION, WordTypes.START_WORD);
        addToList(indicatorList, new String[]{"что", "за"},QType.FUNCTIONS_DESCRIPTION, WordTypes.START_WORD);

        addToList(indicatorList, new String[]{"что", "зачем", "для"},QType.MISSION_DESCRIPTION, WordTypes.START_WORD);

        addToList(indicatorList, new String[]{"что"},QType.DIFFERENCES_DESCRIPTION, WordTypes.START_WORD);
        addToList(indicatorList, new String[]{"что"},QType.COMMONS_DESCRIPTION, WordTypes.START_WORD);

        addToList(indicatorList, new String[]{"что","на"},QType.POSSIBILITIES_DESCRIPTION, WordTypes.START_WORD);

        addToList(indicatorList, new String[]{"к"},QType.CORRESPONDS_TO_DESCRIPTION, WordTypes.START_WORD);
        addToList(indicatorList, new String[]{"что"},QType.GOALS_DESCRIPTION, WordTypes.START_WORD);
        addToList(indicatorList, new String[]{"что","как"},QType.SETS_CHANGES_DESCRIPTION, WordTypes.START_WORD);

        //now writing to DB
        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();

        for (Iterator<IndicatorWord> iterator = indicatorList.iterator(); iterator.hasNext();) {
            IndicatorWord next = iterator.next();
            session.save(next);
            logger.info(next.getValue()+" saved.");
        }

        session.getTransaction().commit();
        session.close();
    }

    /**
     * Helper method for filling list with data
     * @param targetList - list where indicator words will be added
     * @param words - array of words
     * @param type - type of indicator
     */
    private void addToList(List<IndicatorWord> targetList, String[] words, QType type, WordTypes wordType){
        for (int i = 0; i < words.length; i++) {
            String word = words[i];
            targetList.add(new IndicatorWord(word, type, wordType));
        }
    }

    /**
     * Method for generating Goals Knowledge Base data
     */
    private void generateGoalsBase() throws Exception {
        List<GoalFact> goals = new ArrayList<GoalFact>();

        //Firstly we should create a finite set of transformation rules
        TransformationRule VERB_PT_RULE = new TransformationRule("#X #A #B", MorphState.VERB_PT);    //Google заключил успешную сделку
        TransformationRule VERB_PT_PV_RULE = new TransformationRule("#B #A #X", MorphState.VERB_PT_PV); //Успешная сделка заключена Google
        TransformationRule NONE_RULE = new TransformationRule("#X #A #B", MorphState.NONE); //Google выпуск новый продукт
        TransformationRule VERB_PT_RULE2 = new TransformationRule("#B #X #A", MorphState.VERB_PT); //Объем продаж Google вырос
        TransformationRule VERB_RULE = new TransformationRule("#X #A #B", MorphState.VERB); //Google выпускает новый продукт
        TransformationRule NONE_RULE2 = new TransformationRule("#A #B #X", MorphState.NONE); //выпуск новый продукт Google

        //Facts from left column of fact table in chapter 3
        goals.add(new GoalFact("компания", "поглощение", "компании", 0, GoalFactValue.POSITIVE, MorphState.NONE, NONE_RULE2, NONE_RULE));
        goals.add(new GoalFact("компания", "поглощает", "компанию", 0, GoalFactValue.POSITIVE, MorphState.VERB,VERB_RULE));
        goals.add(new GoalFact("компания", "поглотил", "компанию", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT, VERB_PT_RULE));

        goals.add(new GoalFact("компания", "поглощение", "компанией", 0, GoalFactValue.NEGATIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "поглощен", "компанией", 0, GoalFactValue.NEGATIVE, MorphState.VERB_PT_PV));


        goals.add(new GoalFact("компания", "лидер", "рынка", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        /*goals.add(new GoalFact("лидер", "сферы", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("лидер", "отрасли", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("лидер", "сегмента", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("лидер", "направления", 0, GoalFactValue.POSITIVE, MorphState.NONE));*/

        goals.add(new GoalFact("компания", "выпуск", "продукта", 0, GoalFactValue.POSITIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "выпустил", "продукт", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT, VERB_PT_RULE2, VERB_PT_RULE));
        goals.add(new GoalFact("компания", "выпускает", "продукт", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "выпущен", "продукт", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));


        goals.add(new GoalFact("компания", "открытие", "офиса", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "открывает", "офис", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "открыл", "офис", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "открыт", "офис", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        /*goals.add(new GoalFact("открытие", "представительства", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("открыл", "представительство", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("было открыто", "представительство", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));*/

        goals.add(new GoalFact("компания", "заключение", "выгодной сделки", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "заключает", "выгодную сделку", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "заключил", "выгодную сделку", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "заключена", "выгодная сделка", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "заключение", "успешной сделки", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "заключает", "успешную сделку", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "заключил", "успешную сделку", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "заключена", "успешная сделка", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "подписание", "контракта", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "подписывает", "контракт", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "подписал", "контракт", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "подписан", "контракт", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "выход", "на новый рынок", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "выходит", "на новый рынок", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "вышел", "на новый рынок", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));

        goals.add(new GoalFact("компания", "создание", "нового предложения", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "создал", "новое предложение", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "создано", "новое предложение", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "завоевание", "рынка", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "завоевывает", "рынок", 0, GoalFactValue.POSITIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "завоевал", "рынок", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "завоеван", "рынок", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "победа", "в конкурсе", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "побеждает", "в конкурсе", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "победил", "в конкурсе", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));

        goals.add(new GoalFact("компания", "работодатель", "года", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "компания", "года", 0, GoalFactValue.POSITIVE, MorphState.NONE));


        //Facts from middle column of fact table in chapter 3
        goals.add(new GoalFact("компания", "автоматизация", "производства", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "автоматизирует", "производство", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "автоматизировал", "производство", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "автоматизировано", "производство", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));


        goals.add(new GoalFact("компания", "оптимизация", "процесс", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "оптимизирует", "процесс", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "оптимизировал", "процесс", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "оптимизирован", "процесс", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "модернизация", "технологий", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "модернизирует", "технологии", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "модернизировал", "технологии", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "модернизированы", "технологии", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "соответствие", "стандартам", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "соответствует", "стандартам", 0, GoalFactValue.POSITIVE, MorphState.VERB));

        goals.add(new GoalFact("компания", "соответствие", "требованиям", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "соответствует", "требованиям", 0, GoalFactValue.POSITIVE, MorphState.VERB));

        goals.add(new GoalFact("компания", "внедрение", "системы", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "внедряет", "систему", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "внедрил", "систему", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "внедрена", "система", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "внедрение", "методики", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "внедряет", "методику", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "внедрил", "методику", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "внедрена", "методика", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "внедрение", "методология", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "внедряет", "методологию", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "внедрил", "методологию", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "внедрена", "методология", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "внедрение", "технологии", 0, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "внедряет", "технологию", 0, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "внедрил", "технологию", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "внедрена", "технология", 0, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));


        //Facts from right column of fact table in chapter 3
        goals.add(new GoalFact("компания", "увеличение", "объема продаж", 1, GoalFactValue.POSITIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "увеличился", "объем продаж", 1, GoalFactValue.POSITIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "увеличил", "объем продаж", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "увеличен", "объем продаж", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));

        goals.add(new GoalFact("компания", "снижение", "объема продаж", -1, GoalFactValue.NEGATIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "снизился", "объем продаж", -1, GoalFactValue.NEGATIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "снизил", "объем продаж", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "снижен", "объем продаж", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));

        goals.add(new GoalFact("компания", "повышение", "рейтинга", 1, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "повысился", "рейтинга", 1, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "повысил", "рейтинга", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT));

        goals.add(new GoalFact("компания", "снижение", "рейтинга", -1, GoalFactValue.NEGATIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "снизился", "рейтинг", -1, GoalFactValue.NEGATIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "снизил", "рейтинг", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "снижен", "рейтинг", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "снижение", "привлекательности", -1, GoalFactValue.NEGATIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "снизилась", "привлекательность", -1, GoalFactValue.NEGATIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "снизил", "привлекательность", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "снижена", "привлекательность", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "повышение", "привлекательности", 1, GoalFactValue.POSITIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "повысилась", "привлекательность", 1, GoalFactValue.POSITIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "повысил", "привлекательность", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "повышена", "привлекательность", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "увеличение", "выручки", 1, GoalFactValue.POSITIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "увеличилась", "выручка", 1, GoalFactValue.POSITIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "увеличил", "выручку", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "увеличена", "выручка", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));

        goals.add(new GoalFact("компания", "уменьшение", "выручки", -1, GoalFactValue.NEGATIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "уменьшилась", "выручка", -1, GoalFactValue.NEGATIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "уменьшил", "выручку", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "уменьшена", "выручка", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT_PV));


        goals.add(new GoalFact("компания", "рост", "прибыли", 1, GoalFactValue.POSITIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "возросла", "прибыль", 1, GoalFactValue.POSITIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "увеличил", "прибыль", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "возросла", "прибыль", 1, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));

        goals.add(new GoalFact("компания", "снижение", "прибыли", -1, GoalFactValue.NEGATIVE, MorphState.NONE));
        goals.add(new GoalFact("компания", "снизилась", "прибыль", -1, GoalFactValue.NEGATIVE, MorphState.VERB));
        goals.add(new GoalFact("компания", "снизил", "прибыль", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT));
        goals.add(new GoalFact("компания", "снижена", "прибыль", -1, GoalFactValue.NEGATIVE, MorphState.VERB_PT_PV));

        goals.add(new GoalFact("компания", "увеличение", "расходов", 1, GoalFactValue.NEGATIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "увеличились", "расходы", 1, GoalFactValue.NEGATIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "увеличил", "расходы", 1, GoalFactValue.NEGATIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "увеличены", "расходы", 1, GoalFactValue.NEGATIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));

        goals.add(new GoalFact("компания", "снижение", "расходов", -1, GoalFactValue.POSITIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "снизились", "расходы", -1, GoalFactValue.POSITIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "снизил", "расходы", -1, GoalFactValue.POSITIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "снижены", "расходы", -1, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));


        goals.add(new GoalFact("компания", "увеличение", "затрат", 1, GoalFactValue.NEGATIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "увеличились", "затраты", 1, GoalFactValue.NEGATIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "увеличил", "затраты", 1, GoalFactValue.NEGATIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "увеличены", "затраты", 1, GoalFactValue.NEGATIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));


        goals.add(new GoalFact("компания", "снижение", "затрат", -1, GoalFactValue.POSITIVE, MorphState.NONE, NONE_RULE, NONE_RULE2));
        goals.add(new GoalFact("компания", "снизились", "затраты", -1, GoalFactValue.POSITIVE, MorphState.VERB, VERB_RULE));
        goals.add(new GoalFact("компания", "снизил", "затраты", -1, GoalFactValue.POSITIVE, MorphState.VERB_PT, VERB_PT_RULE, VERB_PT_RULE2));
        goals.add(new GoalFact("компания", "снижены", "затраты", -1, GoalFactValue.POSITIVE, MorphState.VERB_PT_PV, VERB_PT_PV_RULE));


        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();

        session.save(NONE_RULE);
        session.save(NONE_RULE2);
        session.save(VERB_RULE);
        session.save(VERB_PT_RULE);
        session.save(VERB_PT_RULE2);
        session.save(VERB_PT_PV_RULE);

        for (Iterator<GoalFact> iterator = goals.iterator(); iterator.hasNext();) {
            GoalFact next = iterator.next();
            session.save(next);
            logger.info(next.getFact()+" "+next.getAddition()+" "+next.getValue()+" "+next.getMorphState()+" saved.");
        }

        session.getTransaction().commit();
        session.close();
    }

     /**
     * Method for generating Goals Knowledge Base data
     */
    private void generateSetChangesBase(){
        //first we must generate indicators
        String[] indicators = {"пришел","покинул","занял пост", "вошел в состав", "уволен", "назначен", "сменил"}; //for "руководство"
        List<ChangeIndicator> changeIndicatorsManagement = new ArrayList<ChangeIndicator>(indicators.length);
        for(String indicator:indicators){
            changeIndicatorsManagement.add(new ChangeIndicator(indicator));
        }

        indicators = new String[] {"расформирован","создан","запущен", "вошел в состав"}; //for "компания"
        List<ChangeIndicator> changeIndicatorsCompany = new ArrayList<ChangeIndicator>(indicators.length);
        for(String indicator:indicators){
            changeIndicatorsCompany.add(new ChangeIndicator(indicator));
        }

        //components
        String[] components = {"президент", "вице-президент", "директор", "заместитель директора"}; //руководство компании
        List<SetComponent> managementComponents = new ArrayList<SetComponent>(components.length);
        for(String component:components){
            managementComponents.add(new SetComponent(component, changeIndicatorsManagement));
        }

        String[] management = {"директор", "начальник", "заместитель"}; //руководство департамента
        List<SetComponent> managementComponents2 = new ArrayList<SetComponent>(management.length);
        for(String man : management){
            managementComponents2.add(new SetComponent(man, changeIndicatorsManagement));
        }

        components = new String[] {"департамент", "отдел", "служба", "рабочая группа"}; //компания
        List<SetComponent> companyComponents = new ArrayList<SetComponent>(components.length);
        for(String component:components){
            companyComponents.add(new SetComponent(component, changeIndicatorsCompany));
        }



        //sets

        //компания
        String[] companies = {"компания", "фирма", "предприятие", "корпорация"};
        List<SetEntity> companyList = new ArrayList<SetEntity>(companies.length);
        for(String company:companies){
            companyList.add(new SetEntity("компания", 0, company, companyComponents));
        }

        //руководство руководство компании
        SetEntity manager = new SetEntity("компания", 1, "руководство", managementComponents);

        //Множество департамент и его компоненты: начальник, зам и т.д.
        components = new String[] {"департамент", "отдел", "служба", "рабочая группа"}; //different names of department
        List<SetEntity> departmentList = new ArrayList<SetEntity>(companies.length);
        for(String component:components){
            departmentList.add(new SetEntity("компания", 2, component, managementComponents2));
        }


        Session session = HibernateUtil.getSessionFactory().openSession();
        session.beginTransaction();


        for (Iterator<ChangeIndicator> iterator = changeIndicatorsManagement.iterator(); iterator.hasNext();) {
            ChangeIndicator next = iterator.next();
            session.save(next);
            logger.info(next.getClass() +" "+  next.getValue()+" saved.");
        }

        for (Iterator<ChangeIndicator> iterator = changeIndicatorsCompany.iterator(); iterator.hasNext();) {
            ChangeIndicator next = iterator.next();
            session.save(next);
            logger.info(next.getClass() +" "+  next.getValue()+" saved.");
        }

        for (Iterator<SetComponent> iterator = managementComponents.iterator(); iterator.hasNext();) {
            SetComponent next = iterator.next();
            session.save(next);
            logger.info(next.getClass() +" "+  next.getValue()+" saved.");
        }

        for (Iterator<SetComponent> iterator = managementComponents2.iterator(); iterator.hasNext();) {
            SetComponent next = iterator.next();
            session.save(next);
            logger.info(next.getClass() +" "+  next.getValue()+" saved.");
        }

        for (Iterator<SetComponent> iterator = companyComponents.iterator(); iterator.hasNext();) {
            SetComponent next = iterator.next();
            session.save(next);
            logger.info(next.getClass() +" "+  next.getValue()+" saved.");
        }

        for (Iterator<SetEntity> iterator = companyList.iterator(); iterator.hasNext();) {
            SetEntity next = iterator.next();
            session.save(next);
            logger.info(next.getClass() +" "+  next.getValue()+" saved.");
        }

        for (Iterator<SetEntity> iterator = departmentList.iterator(); iterator.hasNext();) {
            SetEntity next = iterator.next();
            session.save(next);
            logger.info(next.getClass() +" "+  next.getValue()+" saved.");
        }

             session.save(manager);
            logger.info(manager.getClass() +" "+ manager.getValue()+" saved.");


        session.getTransaction().commit();
        session.close();
    }


    //main method serves only as utility for filling database
    public static void main(String ... args){
        DictionariesGenerator dictionariesGenerator = new DictionariesGenerator();
        dictionariesGenerator.generateDictionaries();

        dictionariesGenerator.generateSetChangesBase();

        try {
            dictionariesGenerator.generateGoalsBase();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
